#include <curses.h>
#include <signal.h>
#include <unistd.h>
#include "airplane.h"

// 全局标志位
int ACCIDENT = 0;
int LOGO = 0;
int FLY = 0;
int C51 = 0;
int INTR = 0;

// 在指定位置绘制字符串，支持左移
int my_mvaddstr(int y, int x, char *str) {
    for (; x < 0; ++x, ++str)
        if (*str == '\0')
            return ERR;

    for (; *str != '\0'; ++str, ++x)
        if (mvaddch(y, x, *str) == ERR)
            return ERR;

    return OK;
}

// 处理命令行参数，设置标志位
void option(char *str) {
    extern int ACCIDENT, FLY, LOGO, C51, INTR;

    while (*str != '\0') {
        switch (*str++) {
            case 'a': ACCIDENT = 1;
                      break;
            case 'F': FLY = 1;
                      break;
            case 'l': LOGO = 1;
                      break;
            case 'c': C51 = 1;
                      break;
            case 'e': INTR = 1;
                      break;
            default:
                      break;
        }
    }
}

static char *plane_pattern[] = {
    LINE_1,
    LINE_2,
    LINE_3,
    LINE_4,
    LINE_5,
    LINE_6,
    LINE_7,
    LINE_8,
    LINE_9,
    LINE_10,
    LINE_11,
    LINE_12,
    LINE_13,
    LINE_14,
};

// 在指定位置绘制飞机
int add_plane(int x) {
    int y = LINES / 2 - sizeof(plane_pattern) / sizeof(plane_pattern[0]) / 2;

    for (int i = 0; i < sizeof(plane_pattern) / sizeof(plane_pattern[0]); ++i) {
        // 清除之前位置的飞机字符
        for (int j = 0; j < COLS; j++) {
            mvaddch(y + i, j, ' ');
        }
        // 绘制飞机并使飞机从左往右飞
        my_mvaddstr(y + i, x, plane_pattern[i]);
    }

    return OK;
}

// 添加飞机烟雾拖尾效果
void add_smoke_trail(int x, int trail_length) {
    int y = LINES / 2 - sizeof(plane_pattern) / sizeof(plane_pattern[0]) / 2;

    for (int i = 0; i < sizeof(plane_pattern) / sizeof(plane_pattern[0]); ++i) {
        for (int j = 1; j <= trail_length; ++j) {
            int smoke_x = x - j;
            int smoke_y = y + i;

            for (int k = -j / 2; k <= j / 2; ++k) {
                if (smoke_x + k >= 0 && smoke_x + k < COLS) {
                    mvaddch(smoke_y, smoke_x + k, SMOKE_CHARS[(j + k) % NUM_SMOKE_CHARS]);
                }
            }
        }
    }
}

int main(int argc, char *argv[]) {
    // 处理命令行参数
    for (int i = 1; i < argc; ++i) {
        if (*argv[i] == '-') {
            option(argv[i] + 1);
        }
    }

    // 初始化屏幕
    initscr();

    // 忽略 Ctrl+C 信号
    if (INTR == 0) {
        signal(SIGINT, SIG_IGN);
    }

    // 设置一些屏幕属性
    noecho();
    curs_set(0);
    nodelay(stdscr, TRUE);
    leaveok(stdscr, TRUE);
    scrollok(stdscr, FALSE);

    int plane_width = 50; // 假设飞机宽度为50个字符
    int x = -plane_width; // 初始位置在屏幕左侧之外
    int smoke_trail_length = 5; // 烟雾拖尾长度

    // 移动飞机并添加烟雾效果
    while (x < COLS) {
        if (LOGO == 1) {
            // 添加 logo 的相关代码
        } else {
            if (add_plane(x) == ERR) break;
            add_smoke_trail(x, smoke_trail_length);
        }

        int ch = getch();
        if (ch != ERR) break; // 如果按下按键，则退出循环
        refresh();
        usleep(40000); // 控制飞机移动速度
        x += 3; // 每次让飞机向右移动3个字符
    }

    // 恢复光标位置并结束
    mvcur(0, COLS - 1, LINES - 1, 0);
    endwin();

    return 0;
}